/*!
 *  \file       TimeEntropyGenerator.cpp
 *  \brief      Implementazione della classe \c TimeEntropyGenerator
 *  \author     Davide Scola <S2299453@studenti.unige.it>
 *  \author	Minetti Alberto <S3064777@studenti.unige.it>
 *  \version    1.0
 */

#include <ctime>
#include <cstdlib>
#include "IEntropyGenerator.hpp"
#include "TimeEntropyGenerator.hpp"

using namespace std;


/*!
 *  \brief      Costruttore di \c TimeEntropyGenerator
 */
TimeEntropyGenerator::TimeEntropyGenerator( )
{
  time( &this->seed_ ); //this->seed_ ^= getpid();
  srandom( this->seed_ );
}

/*!
 *  \brief      Costruttore di copia di \c TimeEntropyGenerator
 *  \param[in]	other	generatore da copiare
 */
TimeEntropyGenerator::TimeEntropyGenerator( TimeEntropyGenerator const& other )
{
  this->seed_ = other.seed_;
  srandom( this->seed_ );
}

/*!
 *  \brief      Operatore di assegnazione della classe \c TimeEntropyGenerator
 *
 */
TimeEntropyGenerator &
TimeEntropyGenerator::operator=( const TimeEntropyGenerator& other )
{
   if (this == &other) {
       return *this;
   }
   
   this->seed_ = other.seed_;
   srandom( this->seed_ );
   
   return *this;
}


/*!
 *  \brief      Operatore di uguaglianza della classe \c TimeEntropyGenerator
 */
bool
TimeEntropyGenerator::operator==( const TimeEntropyGenerator& other ) const
{
    return this->seed_ == (&other)->seed_;
}

/*!
 *  \brief      Operatore di diseguaglianza della classe \c TimeEntropyGenerator
 */
bool
TimeEntropyGenerator::operator!=( const TimeEntropyGenerator& other ) const
{
    return !( *this == other );
}


/*!
 *  \brief      Ritorna il valore pseudo-random che puo` essere generato
 *  \return	Valore massimo
 */
long
TimeEntropyGenerator::max( void )
{
  return RAND_MAX;
}

/*!
 *  \brief      Ritorna un intero pseudo-random nel range [0; 2**31 - 1]
 *  \return	Entropia generata
 */
long
TimeEntropyGenerator::gather( void )
{
  return random();
}
